import 'dart:convert';

import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:local_task/common/tools/date_tool.dart';
import 'package:uuid/uuid.dart';
import '../main.dart';
import '../model/task_model.dart';

/// 任务控制器
class TaskController extends GetxController {
  /// 任务标题
  var title = "".obs;

  /// 任务内容
  var taskContent = "".obs;

  /// 截止日期。
  var cutOffDate = DateTime
      .now()
      .obs;

  /// 截止日期描述文本
  var cutOffDateDesc = TaskType.cutOffDate.desc.obs;

  /// 提醒日期。
  var remindDate = DateTime
      .now()
      .obs;

  /// 提醒日期描述文本
  var remindDateDesc = TaskType.remindDate.desc.obs;

  /// 任务列表。TaskEntity
  var taskList = [].obs;

  /// 【我的一天】任务数量
  var todayTaskNum = 0.obs;

  /// 【任务】任务数量。
  var taskNum = 0.obs;

  final String _key = "task";

  @override
  void onInit() {
    super.onInit();

    /// 默认加载数量
    todayTaskCount();
    taskCount();
  }

  /// 删除所有数据。
  void delAll() {
    sharedPreferences.remove(_key);
  }

  /// 保存任务。
  void saveTask(TaskEntity entity) {
    String entityJson = jsonEncode(entity);
    print("==========>taskJson: $entityJson");

    // 操作数据库。
    List<String>? tasks = sharedPreferences.getStringList(_key);
    tasks ??= [];
    if (entity.id == null || entity.id == '') {
      entity.id = const Uuid().v1();
    }
    tasks.add(entityJson);
    sharedPreferences.setStringList(_key, tasks);

    // 更新controller数据。
    if (title.value == TaskType.today.desc && checkIsTodayTask(entity)) {
      taskList.add(entityJson);
    } else if (title.value == TaskType.task.desc) {
      taskList.add(entityJson);
    }
    taskList.refresh();
    taskNum += 1;
    todayTaskNum.value = todayTaskCount();
    // 恢复默认的时间
    cutOffDate.value = DateTime.now();
    cutOffDateDesc.value = TaskType.cutOffDate.desc;
    remindDate.value = DateTime.now();
    remindDateDesc.value = TaskType.remindDate.desc;
    taskContent.value = "";
  }

  /// 查询所有任务
  List<String> listAllTask() {
    print("===========> 查询所有数据。。。。。");
    List<String> result = sharedPreferences.getStringList(_key) ?? [];
    taskList.removeRange(0, taskList.length); //清空
    taskList.addAll(result);
    taskList.refresh();
    // TODO: setState() or markNeedsBuild called during build
    taskNum.value = result.length;
    return result;
  }

  /// 获取今日数据。
  List<String> listTodayData() {
    print("===========> 查询今日数据。。。。。");

    List<String> tasks = sharedPreferences.getStringList(_key) ?? [];
    String today = DateTool.parseToString(DateTime.now());

    List<String> result = [];
    // 根据两个日期筛选出今日任务和今日到期任务。
    for (String taskJson in tasks!) {
      Map<String, dynamic> taskMap = jsonDecode(taskJson);
      if (taskMap["cutOffDate"] != null && taskMap["cutOffDate"] == today) {
        result.add(taskJson);
      } else if (taskMap["remindDate"] != null &&
          taskMap["remindDate"] == today) {
        result.add(taskJson);
      }
    }

    todayTaskNum.value = result.length;
    return result;
  }

  /// 今日任务数。
  int todayTaskCount() {
    return listTodayData().length;
  }

  /// 任务个数。
  int taskCount() {
    List<String>? taskList = sharedPreferences.getStringList(_key);
    return taskList == null ? 0 : taskList.length;
  }

  void deleteById(String id) {
    print("========> 根据id删除数据: $id");
    List<String> result = [];

    // 删除controller数据。
    TaskEntity? task; //被删除的数据。
    for (int i = 0; i < taskList.length; ++i) {
      task = TaskEntity.jsonToEntity(taskList[i]);
      if (task.id == id) {
        taskList.removeAt(i);
        break;
      }
    }
    // 刷新controller
    taskList.refresh();
    taskNum.value -= 1;
    if (task != null && checkIsTodayTask(task)) {
      todayTaskNum.value -= 1;
    }

    // 删除数据库数据。
    _deleteByIdStore(_key,id);

  }

  /// 从数据库删除数据。
  void _deleteByIdStore(String key, String id) {
    List<String>? tasks = sharedPreferences.getStringList(_key);
    if (tasks == null || tasks.isEmpty) {
      return;
    }

    TaskEntity entity;
    for (int i = 0; i < tasks.length; i++) {
      entity = TaskEntity.jsonToEntity(tasks[i]);
      if (entity.id == id) {
        tasks.removeAt(i);
      }
    }

    sharedPreferences.setStringList(_key, tasks);
  }

  /// 返回 true 表示是今日数据。
  bool checkIsTodayTask(TaskEntity entity) {
    bool result = false;
    String nowDateStr = DateTool.parseToString(DateTime.now());
    if (((entity.cutOffDate != null && entity.cutOffDate == nowDateStr)
            ||
            (entity.remindDate != null && entity.remindDate == nowDateStr))) {
      result = true;
    }
    return result;
  }

  /// 更新操作（数据库）。
  void updateEntityStore(TaskEntity entity) {
    if (entity.id == null) {
      return;
    }

    List<String>? tasks = sharedPreferences.getStringList(_key);
    if (tasks == null || tasks.isEmpty) {
      return;
    }

    List<String>? updateTasks = [];
    TaskEntity task;
    for (String taskJson in tasks) {
      task = TaskEntity.jsonToEntity(taskJson);
      if (task.id == entity.id) {
        updateTasks.add(jsonEncode(entity));
      } else {
        updateTasks.add(taskJson);
      }
    }
    sharedPreferences.setStringList(_key, updateTasks);
  }

  /// 根据任务内容搜索（数据库）
  List<TaskEntity> listByContentStore(String content) {
    List<String>? entityListJson = sharedPreferences.getStringList(_key);
    if (entityListJson == null) {
      return [];
    }

    List<TaskEntity> entityList = TaskEntity.jsonToList(entityListJson);
    List<TaskEntity> result = [];
    for (TaskEntity entity in entityList) {
      if (entity.content.contains(content)) {
        result.add(entity);
      }
    }

    return result;
  }

}
